I denne øvelse skal vi arbejde med at sende beskeder imellem tråde hvor vi opretter en message class. Dette betyder at vi er nød til at benytte is af polymofi. Det smarte ved dette er at vi kan forenkle vores kode ved at vi nedarver klasser fra hinande, i dette tilfælde message som vil blive benytte både af sender og modtager. Af denne grund er vi nød til at lave Message som en basic klasse.

Del 1
Koden der skal bruges for klassen Message og som alle beskeder nedarver fra:
class Message
{
 public:
    virtual ~Message(){}
};
Hvorfor er det vigtigt at vores destruktor er virtuel
destructoren bliver erklæret virtuel for at vi ikke kalder destruktoren for basisklassen men i stedet bruger destruktoren for det objekt vi behandler.

hvilken STL container skal vi vælge til mores MsgQueue klasse
I vores kø klasse skal der bruges en container til at lagre vores information, containeren skal være god til at kunne lave en kø
derfor er det en fordel at vores STL container kan tage objekter ind og sende dem ud igen i kronologisk rækkefølge samtidigt er det en fordel at denne kan finde den
første massage. For at løse denne opgave benytter vi os af STL. STL er en række standard skabeloner som mange har testet og udarbejdet. Vi kan gå ind på cplusplus.com for at læse om de forskellige. Vi søger en STL der har FIFO men også en søge funktion og så arbejder den med at søge efter den mappede value og key value.



del 2

void* send(void * data)
{
    point3D *  punkt1 = new point3D;
    punkt1-> x = 1;
    punkt1-> y = 2;
    punkt1-> z = 3;
    MQ.send(ID_POINT,punkt1);
}
Her ses vores implementation af vores send() funktion
Vi opretter en instands af point3D og tildeler den værdier.
void* resive(void *data)
{
    size_t id;
    Message* msg_ = MQ.receive(id);
    if(id == ID_POINT)
    {
        point3D* point = dynamic_cast<point3D*> (msg_);
        cout << point->x << endl;
            cout << point->y << endl;
                cout << point->z << endl;
        }
    else
    {
        cout << "error" << endl;
    }
 
    delete msg_;
}
 
Dette er vores implementation af receive. Her kan det ses at det er denne funktion som nedlægger den gamle message.

Spørgsmål:
  1. Normalt er det den som opretter som nedlægger objekter. I vores tilfælde er det dog receiver threaden som nedlægger da objektet ikke længere skal bruges når receiveren har haft fat i den. Da der er mere end én sender ville man resikere at de ville komme til at delægge hinandens instanser hvis det var dem som nedlagde objekterne.
  2. Om vi skulle lave programmet på en anden måde ville det være mere hensigtsmæssigt om det var queue som var ejer. Dette ville være tilfældet om vi skulle bygge et korrekt produkt.
  3. Ved at vi giver msgQueue som argumentet til trådene får disse kendskab til denne.
  4. Point3D nedarves fra class massage fordi vi ser point3D som en massage som bliver sendt rundt.


struct point3D : Message
{
    int x;
    int y;
    int z;
};


del 3

i denne opgave reimplementerer vi PCLS opgaven fra tidligere vor vi tidligere blot styrede threadsne med signaler bruges der nu
besked køer og statemashine prinsippet.

selve statemashinen bliver lavet ved at bruge cases disse cases aktiveres ud fra
en række id der alle er lagt i en enumerated eller i c kode enum samling
enum { ID_ENTRY_OPEN_REQUEST, ID_ENTRY_OPEN_CONFIRM, ID_EXIT_OPEN_REQUEST,
          ID_EXIT_OPEN_CONFIRM,  ID_WAITING_TO_ENTER,   ID_WAITING_TO_EXIT,
       ID_DONE };

fårdelen ved at vi implementerer koden ved hjælp af cases og statemachine er at vi har kan slippe for at bruge mutexes og conditions vi skal blot sende
de rigtige id rundt til de forskellige funktioner.
Indkørsels anmodning modtaget
Indkørsels anmodning modtaget
Indkørsels anmodning modtaget
bil køre ind i garage
bil kører ud af garage
udkørsels anmodning modtaget
bil køre ind i garage
bil kører ud af garage
udkørsels anmodning modtaget
bil køre ind i garage
udkørsels anmodning modtaget
bil kører ud af garage

konklusion
opgaven var til at starte med en svær opgave men efterhånden som man begyndte at danne sig et struktureret
overblik over opgave og fik tegnet nogle ortendlige diagrammer viste opgaven sig at blive mere overskuelig,
men der er ingentvil om at denne metode er en god og effektiv måde til at kommunikerer mellem threads.






void* send(void * data){ point3D * punkt1 = new point3D; punkt1-> x = 1; punkt1-> y = 2; punkt1-> z = 3; MQ.send(ID_POINT,punkt1);


}